﻿using StackExchange.Redis;
using System.Text.Json;
using TeachlyQBank.Models;

namespace TeachlyQBank.DbServer
{
    public class UserAuthenticationMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly IConnectionMultiplexer _redis;
        private readonly ILogger<UserAuthenticationMiddleware> _logger;

        public UserAuthenticationMiddleware(RequestDelegate next, IConnectionMultiplexer redis, ILogger<UserAuthenticationMiddleware> logger)
        {
            _next = next;
            _redis = redis;
            _logger = logger;
        }

        public async Task InvokeAsync(HttpContext context)
        {

            Console.WriteLine("当前路径是: " + context.Request.Path);
            Console.WriteLine("现在你可以看得更加清除了");
            if (
                context.Request.Path.StartsWithSegments("/UserAndRole/Login") ||
                context.Request.Path.StartsWithSegments("/UserAndRole/Enroll") ||
                context.Request.Path.StartsWithSegments("/UserAndRole/ForgotKey") ||
                context.Request.Path.StartsWithSegments("/UserAndRole/LoginSumbit") ||
                context.Request.Path.StartsWithSegments("/UserAndRole/EnrollSumbit") 
            )
            {
                // 直接跳到下一个中间件，不执行任何逻辑
                await _next(context);
                return;
            }


            // 从 Cookie 中获取 sessionId
            context.Request.Cookies.TryGetValue("SessionId", out string sessionId);

            if (string.IsNullOrEmpty(sessionId))
            {
                // 如果没有 sessionId，可以选择重定向到登录页面或返回 401
                context.Response.StatusCode = 401;
                return;
            }

            // 从 Redis 中获取用户信息
            IDatabase db = _redis.GetDatabase();
            string userInfoJson = db.StringGet(sessionId);

            if (string.IsNullOrEmpty(userInfoJson))
            {
                // 如果没有找到用户信息，同样可以选择重定向或返回 401
                return;
            }

            // 如果需要，可以将用户信息添加到 HttpContext 以便后续使用
            var user = JsonSerializer.Deserialize<User>(userInfoJson);
            context.Items["User"] = user;

            // 调用下一个中间件
            await _next(context);
        }
    }

}
